package loaders
{
	/**
	 * 不使用LocalConnection的Loader。保证稳定性。
	 * @author Ryan
	 * 
	 */	
	public class MapLoader
	{
		// 同时加载的图片数量，并不是越大越好。
		/*
		 * modify, make sure that all the request for map will be queued at once
		 * as usual, not all the loader will be used, this feature is useful for
		 * the first login
		 */
		public static var MAX_LOADER : int = 9; 
		public var urlList:Vector.<Object>;
		public var freeList:Vector.<TileLoader>;
        public var onData :Function;
		public var mapId:int;

		private var _lastGetTime:Number;
		
        public function MapLoader() {
			freeList = new Vector.<TileLoader>;
			urlList = new Vector.<Object>;
			initTileList();
        } 
		
		// 这个地方做法不是很好。
		public function getFreeLoader() : TileLoader {
			var i:int = 0;
			var now:Number = new Date().getTime();
			while (i < freeList.length) {
				if (freeList[i].url == null) {
					_lastGetTime = now;
					return freeList[i];
				}
				i++;
			}
			
			if( now - _lastGetTime > 5000 ){
				var tl:TileLoader = new TileLoader(this);
				freeList.push( tl );
				_lastGetTime = now;
				return tl;
			}

			return null;
		} 
		
		public function initTileList() : void {
			var i:int = 0;
			while (i < MAX_LOADER) {
				freeList[i] = new TileLoader(this);
				i++;
			}
			return;
		} 
		
		public function clearAll() : void
		{
			// 清空列表
			urlList = new Vector.<Object>;
			var i:int = 0;
			while (i < freeList.length) {
				if (freeList[i].url != null) {
					TileLoader(freeList[i]).loadNext();
				}
				i++;
			}
			return;
		} 
        
        // ----------------------------------------------------------------
        //
        // 远程调用接口
        //
        // ----------------------------------------------------------------
		
        /**
         * 收到地图数据 
         * @param obj
         * 
         */		
        public function receiveMessage(obj:Object) : void
        {
        	if( onData != null ){
        		onData( obj );
        	}
        } 
		
		public function sendMessage(obj:Object) : void
		{
			// 判断是否切换了地图，如果是，则重新加载新的队列
			// 防止加载到其他地图的资源。
			if( mapId != obj.mid ){
				clearAll();
				mapId = obj.mid;
			}
			var loader:TileLoader = null;
//			switch( obj.type )
//			{
//				case MapConnection.MSG_TYPE_LOAD:
					loader = getFreeLoader();
					if ( loader ) {
						loader.load(obj);
					} else {
						urlList.push(obj);
					}
//					break;
//				case MapConnection.MSG_TYPE_CLEAR:
//					clearAll();
//					break;
//				default:
//					break;
//			}
			return;
		} 
        
	}
}